package com.sky.service.wx_user.impl;

import com.sky.context.BaseContext;
import com.sky.entity.AddressBook;
import com.sky.mapper.AddressBookMapper;
import com.sky.service.wx_user.WXAddressBookService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;

@Service
@Slf4j
public class WXAddressBookServiceImpl implements WXAddressBookService {
    @Autowired
    private AddressBookMapper addressBookMapper;

    /**
     * 条件查询
     *
     * @param addressBook
     * @return
     */
    public List<AddressBook> list(AddressBook addressBook) {
        return addressBookMapper.list(addressBook);
    }

    /**
     * 新增地址
     *
     * @param addressBook
     */
    public void save(AddressBook addressBook) {
        //设置用户id
        addressBook.setUserId(BaseContext.getCurrentId());
        //设置默认地址
        addressBook.setIsDefault(0);
        addressBookMapper.insert(addressBook);
    }

    /**
     * 根据id查询
     *
     * @param id
     * @return
     */
    public AddressBook getById(Long id) {
        AddressBook addressBook = addressBookMapper.getById(id);
        return addressBook;
    }

    /**
     * 根据id修改地址
     *
     * @param addressBook
     */
    public void update(AddressBook addressBook) {
        addressBookMapper.update(addressBook);
    }


//    /**
//     * 设置或取消默认地址（切换功能）
//     (可以实现但是微信小程序端应该是缺少了一个点击按钮时属性一下页面的功能,显示效果需要重新刷新一下页面才显示效果不明显所以先注释)
//     * @param addressBook 包含要操作的地址ID的地址簿实体对象
//     */
//    @Transactional
//    public void setDefault(AddressBook addressBook) {
//        // 前提：传入的 addressBook 对象必须包含有效的地址ID (addressBook.getId())
//        // 1. 根据ID从数据库查询出该地址的最新、最完整的状态
//        //    （这是必要的，因为不能相信前端传来的 isDefault 状态）
//        AddressBook currentAddressInDB = addressBookMapper.getById(addressBook.getId());
//        // 健壮性校验：确保地址存在，并且属于当前用户
//        if (currentAddressInDB == null || !currentAddressInDB.getUserId().equals(BaseContext.getCurrentId())) {
//            // 如果地址不存在或不属于当前用户，可以抛出异常或直接返回，防止非法操作
//            // throw new SomeCustomException("地址不存在或权限不足");
//            return;
//        }
//        // 2. 判断当前地址是否已经是默认地址
//        if (currentAddressInDB.getIsDefault() == 1) {
//            // --- 分支A：当前地址已经是默认地址 ---
//            // 目标：将其取消默认。
//            // update address_book set is_default = 0 where id = ?
//            currentAddressInDB.setIsDefault(0);
//            log.info("取消默认地址：{}", currentAddressInDB);
//            addressBookMapper.update(currentAddressInDB);
//        } else {
//            // --- 分支B：当前地址不是默认地址 ---
//            // 目标：将其设置为默认地址，并取消其他地址的默认状态。
//            // 这部分逻辑与您之前的代码相同。
//            // 2.1、将当前用户的所有地址修改为非默认地址
//            // SQL: update address_book set is_default = 0 where user_id = ?
//            AddressBook updatePayload = new AddressBook();
//            updatePayload.setIsDefault(0);
//            updatePayload.setUserId(BaseContext.getCurrentId());
//            addressBookMapper.updateIsDefaultByUserId(updatePayload);
//            // 2.2、将当前地址改为默认地址
//            // SQL: update address_book set is_default = 1 where id = ?
//            currentAddressInDB.setIsDefault(1);
//            addressBookMapper.update(currentAddressInDB);
//            log.info("设置默认地址：{}", currentAddressInDB);
//        }
//    }
    /**
     * 设置默认地址
     * @param addressBook
     */
    @Transactional
    public void setDefault(AddressBook addressBook) {
        // 1、将当前用户的所有地址修改为非默认地址
        addressBook.setIsDefault(0);
        addressBook.setUserId(BaseContext.getCurrentId());
        addressBookMapper.updateIsDefaultByUserId(addressBook);
        //2、将当前地址改为默认地址 update address_book set is_default = ? where id = ?
        addressBook.setIsDefault(1);
        addressBookMapper.update(addressBook);
    }

    /**
     * 根据id删除地址
     *
     * @param id
     */
    public void deleteById(Long id) {
        addressBookMapper.deleteById(id);
    }

}
